﻿#define _CRT_SECURE_NO_WARNINGS 1
给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点。



示例 1：


输入：head = [1, 2, 3, 4, 5], n = 2
输出：[1, 2, 3, 5]
示例 2：

输入：head = [1], n = 1
输出：[]
示例 3：

输入：head = [1, 2], n = 1
输出：[1]


提示：

链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz


进阶：你能尝试使用一趟扫描实现吗？

来源：力扣（LeetCode）
链接：https ://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

 //运用快慢指针：这种快慢是指一个先走一个后走，两个指针速度相同
    struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
    if (head == NULL)
        return head;
    if (head->next == NULL && n == 1)
        return NULL;
    struct ListNode* cur = head;
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    while (n--)
    {
        fast = fast->next;
    }
    struct ListNode* prev = NULL;
    while (fast)
    {
        prev = slow;
        slow = slow->next;
        fast = fast->next;
    }
    if (prev == NULL)
    {
        head = head->next;

    }
    else
    {
        prev->next = slow->next;
    }
    free(slow);
    slow = NULL;
    return head;


}